package utils

import (
	"os"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
)

/*
 +----------------------------------------------------------------------
 + Title        : zap 日志
 + Author       : huwl
 + Version      : 1.0.0
 + Initial-Time : 2021-09-22
 + Last-time    : 这个文件最后修改的时间 + 修改人的名称
 + Desc         : zap 日志 https://github.com/uber-go/zap
 +----------------------------------------------------------------------
*/

var Zap *zap.Logger

// 初始化带滚动功能的 Zap 日志记录器
func InitLogger() {
	// 配置编码器
	encoderConfig := zap.NewProductionEncoderConfig()
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
	encoderConfig.TimeKey = "timestamp"

	// 创建控制台编码器（开发环境）
	consoleEncoder := zapcore.NewConsoleEncoder(encoderConfig)

	// 创建 JSON 编码器（生产环境）
	jsonEncoder := zapcore.NewJSONEncoder(encoderConfig)

	// 设置日志级别
	atomicLevel := zap.NewAtomicLevel()
	atomicLevel.SetLevel(zap.InfoLevel) // 可改为 DebugLevel 等

	// 添加文件输出
	fileWriter := zapcore.AddSync(&lumberjack.Logger{
		Filename:   "logs/app.log",
		MaxSize:    ZapLoggerMaxSize, // MB
		MaxBackups: ZapLoggerMaxBackups,
		MaxAge:     ZapLoggerMaxAge, // days
	})

	core := zapcore.NewTee(
		zapcore.NewCore(consoleEncoder, zapcore.AddSync(os.Stdout), atomicLevel),
		zapcore.NewCore(jsonEncoder, fileWriter, atomicLevel),
	)

	// 创建核心
	// core := zapcore.NewCore(
	// 	zapcore.NewJSONEncoder(encoderConfig),
	// 	zapcore.AddSync(os.Stdout), // 输出到控制台
	// 	atomicLevel,
	// )

	// 构建 Logger
	Zap = zap.New(core, zap.AddCaller())
	defer Zap.Sync() // 刷新缓冲区
}
